// RUN: not mlir-pdll %s -split-input-file 2>&1 | FileCheck %s

//===----------------------------------------------------------------------===//
// Rewrite Structure
//===----------------------------------------------------------------------===//

// CHECK: expected identifier name
Rewrite {}

// -----

// CHECK: :6:9: error: `Foo` has already been defined
// CHECK: :5:9: note: see previous definition here
Rewrite Foo();
Rewrite Foo();

// -----

Rewrite Foo() -> Value {
  // CHECK: `return` terminated the `Rewrite` body, but found trailing statements afterwards
  return _: Value;
  return _: Value;
}

// -----

// CHECK: missing return in a `Rewrite` expected to return `Value`
Rewrite Foo() -> Value {
  let value: Value;
}

// -----

// CHECK: missing return in a `Rewrite` expected to return `Value`
Rewrite Foo() -> Value => erase op<my_dialect.foo>;

// -----

// CHECK: unable to convert expression of type `Op<my_dialect.foo>` to the expected type of `Attr`
Rewrite Foo() -> Attr => op<my_dialect.foo>;

// -----

// CHECK: expected `Rewrite` lambda body to contain a single expression or an operation rewrite statement; such as `erase`, `replace`, or `rewrite`
Rewrite Foo() => let foo = op<my_dialect.foo>;

// -----

Constraint ValueConstraint(value: Value);

// CHECK: unable to invoke `Constraint` within a rewrite section
Rewrite Foo(value: Value) {
  ValueConstraint(value);
}

// -----

Rewrite Bar();

// CHECK: `Bar` has already been defined
Rewrite Foo() {
  Rewrite Bar() {};
}

// -----

//===----------------------------------------------------------------------===//
// Arguments
//===----------------------------------------------------------------------===//

// CHECK: expected `(` to start argument list
Rewrite Foo {}

// -----

// CHECK: expected identifier argument name
Rewrite Foo(10{}

// -----

// CHECK: expected `:` before argument constraint
Rewrite Foo(arg{}

// -----

// CHECK: inline `Attr`, `Value`, and `ValueRange` type constraints are not permitted on arguments or results
Rewrite Foo(arg: Value<type>){}

// -----

// CHECK: expected `)` to end argument list
Rewrite Foo(arg: Value{}

// -----

//===----------------------------------------------------------------------===//
// Results
//===----------------------------------------------------------------------===//

// CHECK: expected identifier constraint
Rewrite Foo() -> {}

// -----

// CHECK: cannot create a single-element tuple with an element label
Rewrite Foo() -> result: Value;

// -----

// CHECK: cannot create a single-element tuple with an element label
Rewrite Foo() -> (result: Value);

// -----

// CHECK: expected identifier constraint
Rewrite Foo() -> ();

// -----

// CHECK: expected `:` before result constraint
Rewrite Foo() -> (result{};

// -----

// CHECK: expected `)` to end result list
Rewrite Foo() -> (Op{};

// -----

// CHECK: inline `Attr`, `Value`, and `ValueRange` type constraints are not permitted on arguments or results
Rewrite Foo() -> Value<type>){}

// -----

//===----------------------------------------------------------------------===//
// Native Rewrites
//===----------------------------------------------------------------------===//

Pattern {
  // CHECK: external declarations must be declared in global scope
  Rewrite ExternalConstraint();
}

// -----

// CHECK: expected `;` after native declaration
Rewrite Foo() [{}]
